import datetime
import math
import cv2
from moviepy.editor import *
from PIL import Image, ImageDraw, ImageFont,ImageFilter
import numpy as np
from request import get
import os

#编码格式转换
def zh_ch(string):
    return string.encode("gbk").decode('UTF-8', errors='ignore')

# 添加中文
# 转换为PIL的image图片格式,使用PIL绘制文字,再转换为OpenCV的图片格式
def image_add_text(img1, text, left, top, text_color, text_size):
    # 判断图片是否为ndarray格式，转为成PIL的格式的RGB图片
    if isinstance(img1, np.ndarray):
        image = Image.fromarray(cv2.cvtColor(img1, cv2.COLOR_RGB2BGR))
    # 创建一个可以在给定图像上绘图的对象
    draw = ImageDraw.Draw(image)
    # 参数依次为 字体、字体大小、编码
    font_style = ImageFont.truetype("font/simsun.TTF", text_size, encoding='utf-8')
    # 获取文本尺寸
    textlength = draw.textlength(text, font=font_style)
    # 参数依次为位置、文本、颜色、字体
    draw.text((left- math.floor(textlength*0.5), top), text, fill=text_color, font=font_style)
 
    return cv2.cvtColor(np.asarray(image), cv2.COLOR_RGB2BGR)

def img_to_text(img,u1,u2,p1,p2):
   # 读取图片
  image = cv2.imread(img)
  h, w = image.shape[0:2]  

  """
  只能英文
  image：要添加文字的输入图像。
  text：要添加的文字内容。
  org：指定文字的起始位置，表示为左上角坐标。例如，(10,50)表示文字的左上角位于图像的(10,50)像素位置。
  fontFace：指定字体类型。可以是以下几种预定义的字体类型：
  cv2.FONT_HERSHEY_SIMPLEX：正常字体大小的无衬线字体。
  cv2.FONT_HERSHEY_PLAIN：正常字体大小的无衬线字体（相对于上一个字体稍微细一些）。
  cv2.FONT_HERSHEY_DUPLEX：正常字体大小的有衬线字体。
  cv2.FONT_HERSHEY_COMPLEX：正常字体大小的不带斜杠的有衬线字体。
  cv2.FONT_HERSHEY_TRIPLEX：正常字体大小的有三个衬线（即比上述字体稍微粗一些）的带斜体字体。
  cv2.FONT_HERSHEY_COMPLEX_SMALL：正常字体大小的带斜体不带斜线字体。
  cv2.FONT_HERSHEY_SCRIPT_SIMPLEX：正常字体大小的手写风格字体。
  cv2.FONT_HERSHEY_SCRIPT_COMPLEX：较大字体的手写风格字体。
  fontScale：字体缩放因子，指定文字大小。使用1.0表示正常大小。大于1.0为放大，小于1.0为缩小。
  color：要绘制文字的颜色。可以是RGB三元组（例如(255,0,0)表示红色）或者BGR三元组（例如(0,0,255)表示红色）。
  thickness：指定字体的粗细。使用数字指定，数字越大，字体越粗。可以为负值，表示使用粗细大小的字体轮廓。
  """
  # cv2.putText(image, u1, (math.floor(w*0.3), math.floor(h*0.5)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,36), 2)
  image = image_add_text(image, u1, math.floor(w*0.25), math.floor(h*0.44), (0,255,36), 110)
  image = image_add_text(image, u2, math.floor(w*0.75), math.floor(h*0.44), (0,255,36), 110)

  image = image_add_text(image, p1, math.floor(w*0.35)-4, math.floor(h*0.69)-1, (255,255,255), 104)
  image = image_add_text(image, p1, math.floor(w*0.35), math.floor(h*0.69), (0,0,0), 100)
  image = image_add_text(image, p2, math.floor(w*0.65)-4, math.floor(h*0.69)-1, (255,255,255), 104)
  image = image_add_text(image, p2, math.floor(w*0.65), math.floor(h*0.69), (0,0,0), 100)

  return image
  # 显示图片
  # cv2.imshow('image', image)
  # cv2.waitKey(0)

def	 clip_video(input,watermark_img,out_name,start_time,end_time):
  video = VideoFileClip(input)# 读取视频文件
  print(f"视频时长：{video.duration}s")
  print(f"视频大小：{video.size[0]}x{video.size[1]}")

  """
  加图
  """
  watermark = ImageClip(watermark_img)
  # watermark = ImageClip("watermark.png")
  # watermark = watermark.set_position((100, 50)) # 显示在100, 50的位置上

  # 调整水印的大小
  watermark = watermark.resize(width= math.floor(video.size[0]*0.9))

  """
  显示在距离左边百分之10、距离上边百分之5的位置上
  效果就是距左为 屏幕宽度*0.1,距上为 屏幕高度*0.05的位置上
  """
  # watermark = watermark.set_position((0.1, 0.05), True)
  watermark = watermark.set_position(("center","center"))
  watermark = watermark.set_duration(3).set_start(0).set_end(3)

  clip = video.subclip(start_time, end_time) # 截取视频片段
  final_video = CompositeVideoClip([clip, watermark])# 添加水印到视频中
  final_video.write_videofile(f"out/{out_name}") # 导出最终的视频

  # clip.write_videofile('new_video.mp4')# 导出视频文件
  # clip.save_frame("frame.png", t=2) # saves the frame a t=2s

  # speedVideo = clip.speedx(2) # 设置视频倍速播放
  # audioclip1 = clip.audio  # 从视频对象中提取音频
  # audioclip1.write_audiofile('a.mp3')  # 写入音频文件



def is_path(name=None):
    folder_path =name
    if not os.path.exists(folder_path):
        os.makedirs(folder_path)
        print("文件夹已创建！")
    else:
        print("文件夹已存在，无需创建。")

def init_clip(file_name='input/video.mp4',enevt_id='2049',table_no='1',start_time_ms=0):
   is_path('out')
   data= get('https://www.vvsai.com/api/sportsOrder/findOneScoreTime',params={'eventId':enevt_id,'tableNo':table_no})
   for k, v in enumerate(data['result']['list']):
        if v['beginTime']:
            # 从 start_time_ms 创建 datetime 对象
            start_time_ms_dt = datetime.datetime.fromtimestamp(start_time_ms)
            # 从 start_time 创建 datetime 对象
            start_time_dt = datetime.datetime.fromtimestamp(int(v['beginTime']))
            # 比较日期部分是否相同
            if start_time_ms_dt.date() == start_time_dt.date():
                watermark=img_to_text('static/liveLed.jpg',v['player1'],v['player2'],v['unit1'],v['unit2'])
                out_name=f"{v['player1']}vs{v['player2']}.mp4"
                start_time = math.floor((int(v['beginTime']) - start_time_ms)/1000)
                end_time = math.floor((int(v['endTime']) - start_time_ms)/1000)
                print(f"{out_name}-{start_time}-{end_time}")
                clip_video(file_name,watermark,out_name,start_time,end_time)



if __name__ == '__main__':
    init_clip()
    print('脚本')
else:
    print('模块')